from PySide6.QtCore import Signal
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit, QHBoxLayout


class MainWindow(QWidget):
    # 定义一个名为 sendTextToSubWindow 的信号（Signal），该信号将在主窗口与子窗口之间传递文本数据
    sendTextToSubWindow = Signal(str)

    def __init__(self):
        super().__init__()

        self.showBtn = QPushButton('Show')
        self.hideBtn = QPushButton('Hide')
        self.closeBtn = QPushButton('Close')
        self.lineEdit = QLineEdit()

        self.subWindow = SubWindow(self)

        self.btnLayout = QHBoxLayout()
        self.btnLayout.addWidget(self.showBtn)
        self.btnLayout.addWidget(self.hideBtn)
        self.btnLayout.addWidget(self.closeBtn)

        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.lineEdit)
        self.mainLayout.addLayout(self.btnLayout)
        self.setLayout(self.mainLayout)

        self.resize(300, 200)

        self.bind()

    def bind(self):
        self.showBtn.clicked.connect(lambda: self.subWindow.show())
        self.hideBtn.clicked.connect(lambda: self.subWindow.hide())
        self.closeBtn.clicked.connect(lambda: self.subWindow.close())
        # 连接主窗口的 sendTextToSubWindow 信号到子窗口的 lineEdit.setText 槽（slot）
        self.sendTextToSubWindow.connect(self.subWindow.lineEdit.setText)
        self.lineEdit.textChanged.connect(self.send_text)

    def send_text(self):
        """
        发送文本到子窗口

        这个方法通过 `sendTextToSubWindow` 信号将主窗口的 `lineEdit` 中的文本发送到子窗口，
        并将文本设置到子窗口的 `lineEdit` 控件中。
        """
        self.sendTextToSubWindow.emit(self.lineEdit.text())

    def closeEvent(self, event):
        """
        在主窗口关闭时调用，关闭所有子窗口。
        """
        for child in QApplication.topLevelWidgets():
            if child is not self and isinstance(child, QWidget):
                child.close()
        event.accept()


class SubWindow(QWidget):
    # 定义一个名为 sendTextToMainWindow 的信号（Signal），该信号将在子窗口 与 主窗口之间传递文本数据
    sendTextToMainWindow = Signal(str)

    def __init__(self, parent=None):
        super().__init__()

        self.parent = parent
        self.setWindowTitle("子窗口")
        self.lineEdit = QLineEdit()

        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.lineEdit)
        self.setLayout(self.mainLayout)

        self.resize(300, 200)
        self.bind()

    def bind(self):
        self.sendTextToMainWindow.connect(self.parent.lineEdit.setText)
        self.lineEdit.textChanged.connect(self.send_text)

    def send_text(self):
        """
        发送文本到子窗口

        这个方法通过 `sendTextToSubWindow` 信号将主窗口的 `lineEdit` 中的文本发送到子窗口，
        并将文本设置到子窗口的 `lineEdit` 控件中。
        """
        # emit的参数是自定义信号要传递的值
        self.sendTextToMainWindow.emit(self.lineEdit.text())


if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()
